Skip to main content

SQL Window Functions

![[WndowFunctions.pdf]]

🚀 ¡Bienvenido al mundo de las SQL Window Functions, también conocidas como las superhéroes de las funciones de ventana! Estas maravillas te permiten realizar cálculos épicos a través de conjuntos de filas relacionadas con la fila actual de una consulta. A diferencia de las funciones de agregación estándar, ¡no colapsan filas, permitiendo que cada una conserve su identidad única dentro del conjunto de resultados! 💪 Esto es como el circo del cálculo, ¡cada fila tiene su propio acto impresionante!

🔍 Pero espera, hay más. Estas funciones de ventana son como magos que utilizan la cláusula OVER para definir sobre qué conjunto de filas van a lanzar sus hechizos matemáticos. Con trucos como PARTITION BY, que divide el conjunto de resultados en particiones (o grupos) para aplicar la función; ORDER BY, que establece el orden de las filas dentro de cada partición; y las cláusulas ROWS o RANGE, que permiten afinar aún más sobre qué filas dentro de la partición se deben realizar los cálculos. ¡Es como una fiesta mágica para tus datos! 🎉🔮

Ejemplos de funciones de ventana:

  1. ROW_NUMBER(): Asigna un número secuencial a cada fila dentro de la partición de la consulta.

    SELECT
    name,
    department,
    ROW_NUMBER() OVER(PARTITION BY department ORDER BY name) AS row_number
    FROM employees;
  2. RANK(): Asigna un rango a cada fila dentro de una partición. Si hay filas con valores iguales, se les dará el mismo rango, y el siguiente rango se ajustará en consecuencia.

    SELECT
    name,
    score,
    RANK() OVER(ORDER BY score DESC) AS rank
    FROM exam_results;
  3. DENSE_RANK(): Similar a RANK(), pero sin ajustar los rangos consecutivamente, de modo que si hay dos filas con el mismo rango, el siguiente rango es inmediatamente posterior.

    SELECT
    name,
    score,
    DENSE_RANK() OVER(ORDER BY score DESC) AS dense_rank
    FROM exam_results;
  4. SUM(), AVG(), MIN(), MAX(): Estas funciones de agregación conocidas pueden utilizarse como funciones de ventana para calcular sumas, promedios, mínimos y máximos respectivamente, dentro de una partición sin colapsar las filas.

    SELECT
    name,
    department,
    salary,
    SUM(salary) OVER(PARTITION BY department) AS department_salary_sum
    FROM employees;

Las funciones de ventana ofrecen una potente herramienta para realizar análisis complejos directamente en SQL, mejorando la eficiencia al evitar múltiples consultas o el procesamiento externo de datos.

Dummies

Imagina que estás en una clase con varios estudiantes, y cada estudiante ha obtenido distintas notas (calificaciones) a lo largo del semestre. Ahora, quieres realizar diferentes análisis con esas notas sin cambiar la lista original de notas y estudiantes. Aquí es donde entran en juego las funciones de ventana de SQL.

Ejemplo 1: ¿Quién va liderando?

Supongamos que quieres saber el orden de los estudiantes basado en sus notas, pero sin alterar la lista completa. Es como querer ver quién va primero, quién va segundo y así sucesivamente, pero sin reordenar toda la lista.

SELECT
nombre,
nota,
ROW_NUMBER() OVER(ORDER BY nota DESC) AS posicion
FROM estudiantes;

Este código es como asignar una medalla invisible a cada estudiante basado en su nota, de mayor a menor, sin cambiar el orden en que los ves en la lista.

Ejemplo 2: ¿Cómo comparar cada nota con el promedio general?

Ahora, supongamos que quieres comparar la nota de cada estudiante con el promedio de toda la clase para ver quién está por encima y quién por debajo del promedio.

SELECT
nombre,
nota,
AVG(nota) OVER() AS promedio_general
FROM estudiantes;

Este código es como si calcularas el promedio de todas las notas y luego, sin escribir nada en la lista, imaginariamente pones ese promedio al lado de cada estudiante para ver rápidamente cómo se comparan.

Ejemplo 3: "Agrupando" sin separar

Si los estudiantes están divididos en grupos (por ejemplo, "Grupo A" y "Grupo B"), y quieres saber cuánto es el total de notas por grupo, pero sin separar la lista en dos.

SELECT
nombre,
grupo,
nota,
SUM(nota) OVER(PARTITION BY grupo) AS total_notas_grupo
FROM estudiantes;

Este código es como si, de manera imaginaria, sumaras las notas de todos en "Grupo A" y colocaras ese total al lado de cada estudiante de "Grupo A" en la lista, y lo mismo para "Grupo B", sin realmente dividir o alterar la lista original.

Espero que estos ejemplos te ayuden a entender mejor las funciones de ventana de SQL. Piensa en ellas como formas de realizar cálculos y comparaciones imaginarias en tu lista de datos sin cambiar la organización original de esa lista.